package com.bart.b_oo

/**
  * Created by BartG on 2018/10/8.
  * 类似于Java的实现抽象类的方式
  * Java：
  *   子类 extends 抽象类 implements 接口1 , 接口2 , ...
  * Scala：
  *   子类 extends 抽象类 with 接口1 with 接口2 with ...
  *
  * 注意 with 后面只能够使 trait （接口）：
  * 对于 trait 接口使用该方式是正确的： val boy = new Boy with ScalaAbstract
  * 对于 abstract 抽象类，使用该方式是错误的：val boy = new Boy with ScalaAbstract
  * 和java的机制类似
  *
  * type 关键字是类似 java 中的泛型的机制
  * final 关键字功能和 java 中的一样
  */
//class ScalaAbstractImpl extends ScalaAbstract with ScalaTrait {
class ScalaAbstractImpl extends ScalaAbstract {

  override def hello(name: String) = {
    println(s"子类，对着 [${name}] 笑")
  }

  override def smell(name: String) = {
    println(s"子类，对着 [${name}] 笑")
  }

  // 重写父类的泛型
  override type T  = String

  // 重写父类的方法并使用重写的泛型
  override def learn(t: String) = {
    println("learn 的类型是："+ t.getClass.getName)
  }

}

object ScalaAbstractImpl {

  def main(args: Array[String]): Unit = {
    val sai = new ScalaAbstractImpl()
    sai.hello("小明")
    sai.smell("小明")

//    对于抽象类不能够使用该种方式
//    val boy = new Boy with ScalaAbstract

    sai.learn("哈哈") // learn 的类型是：java.lang.String
  }

}

class Boy {

}